﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using R = Szamlazz.Data.Request;

namespace Szamlazz.Data
{ 
	/// <summary>
	/// Számla fejléc információk
	/// </summary>
	public class HeaderInfo : Validatable
	{
		/// <summary>
		/// Konstruktor
		/// </summary>
		public HeaderInfo()
		{
			this.PaymentMethod = Utils.PaymentMethods.BankTransfer;
			this.Language = Utils.Languages.Hungarian;
			this.Currency = "Ft";
			this.IsProformaInvoice = false;
		}

		/// <summary>
		/// Létrehozza az XML kommunikációs objektumot
		/// </summary>
		/// <returns>A kommunikációs objektum</returns>
		internal R.fejlecTipus CreateForRequest()
		{
			return new R.fejlecTipus 
			{ 
				keltDatum = this.Occurence.Date,
				dijbekero = this.IsProformaInvoice,
				dijbekeroSpecified = true,
				elolegszamla = false,
				fizetesiHataridoDatum = this.Deadline,
				szamlaNyelve = this.Language.Value,
				teljesitesDatum = this.Completition,
				vegszamla = false,
				fizmod = this.PaymentMethod.Name,
				penznem = this.Currency,
				szamlaszamElotag = this.NumberPrefix,
				rendelesSzam = this.OrderNumber,
				megjegyzes = this.Notes,
			};
		}

		/// <summary>
		/// Ellenőrzi a kötelező mezőket
		/// </summary>
		/// <returns>Eredmény</returns>
		internal override ValidationResult Validate()
		{
			var ret = base.Validate();

			ret.Evaluate(this.Occurence == default(DateTime), "számla kelte", ValidationResult.ValidationReason.Required);
			ret.Evaluate(this.Completition == default(DateTime), "teljesítés dátuma", ValidationResult.ValidationReason.Required);
			ret.Evaluate(this.Deadline == default(DateTime), "fizetési határidő", ValidationResult.ValidationReason.Required);

			return ret;
		}

		/// <summary>
		/// A komponens neve loggoláskor
		/// </summary>
		internal override string Component
		{
			get { return "számla fejléc"; }
		}

		/// <summary>
		/// Számla kelte
		/// </summary>
		public DateTime Occurence { get; set; }

		/// <summary>
		/// Teljesítés napja
		/// </summary>
		public DateTime Completition { get; set; }

		/// <summary>
		/// Fizetés határideje
		/// </summary>
		public DateTime Deadline { get; set; }

		/// <summary>
		/// Fizetés módja
		/// </summary>
		public Utils.PaymentMethods.PaymentMethod PaymentMethod { get; set; }

		/// <summary>
		/// Pénznem (valójában az összeg mögé íródik)
		/// </summary>
		/// <value>Ft</value>
		public string Currency { get; set; }

		/// <summary>
		/// Számla nyelve
		/// </summary>
		public Utils.Languages.Language Language { get; set; }

		/// <summary>
		/// Megadja, hogy a számla díjbekérő-e
		/// </summary>
		public bool IsProformaInvoice { get; set; }
		/// <summary>
		/// Megrendelés azonosítója (külső azonosító, rákerül a számlára)
		/// </summary>
		public string OrderNumber { get; set; }

		/// <summary>
		/// Számlaszám előtag (egyeznie kell a szamlazz.hu-n megadott előtagok valamelyikével)
		/// </summary>
		public string NumberPrefix { get; set; }
		/// <summary>
		/// Számla megjegyzés
		/// </summary>
		public string Notes { get; set; }
	}
}
